import pandas as pd
pip freeze dan conda env export sama-sama digunakan untuk exporting requirements, namun apa perbedaannya ?¶Command pip freeze digunakan hanya untuk export list dependencies (yaitu daftar packages beserta versinya), sedangkan conda env export tidak hanya dependencies melainkan juga detail lain mengenai environment tersebut seperti name, channels, dan juga prefix.
Saat import requirements dari hasil pip freeze, kita harus mempersiapkan environment kosong terlebih dahulu dengan conda create. Ketika import requirements dari hasil conda env export, kita tidak perlu membuat environment kosong dari awal.
Contoh hasil pip freeze:
docutils==0.11
Jinja2==2.7.2
MarkupSafe==0.19
Pygments==1.6
Sphinx==1.2.2
Contoh hasil conda env export:
name: env-name
channels:
- conda-forge
- defaults
dependencies:
- python=3.7
- codecov
prefix: /Users/username/anaconda3/envs/env-name
requirements.txt atau environment.yml?¶Tidak harus, file bisa dinamakan sebagai apa saja. Namun, sebagai konvensi atau standar penamaan biasa digunakan requirements.txt (untuk hasil pip freeze) ataupun environment.yml (untuk hasil conda env export).
Ketika environment di-export menggunakan pip freeze, pihak yang menerima requirements harus memastikan bahwa saat conda create mencantumkan versi Python yang sesuai dengan sumber. Apabila environment di-export dengan conda env export, maka tidak perlu dikarenakan versi Python sudah disertakan pada list dependencies.
FutureWarning: pandas.util.testing is deprecated saat load library pandas_datareader?¶
Warning tersebut dapat diabaikan, library tetap dapat digunakan dengan baik. Warning muncul karena terdapat perbedaan versi pandas di local (laptop masing-masing) dengan versi pandas yang digunakan pada pandas_datareader.
Object apapun pada Python dapat disimpan menjadi sebuah file bernama pickle, dengan cara "mengawetkan" bentuk dari object tersebut menjadi binary (byte stream). Dikenal dua istilah:
df.to_pickle()pd.read_pickle()Dengan menggunakan file pickle, maka segala informasi di dalam sebuah DataFrame akan "diawetkan". Misalkan pada file pickle pada data_input/stock dapat menjaga bentuk dari MultiIndex DataFrame:
stock = pd.read_pickle('data_input/stock')
stock.head()
Sedangkan ketika kita save stock ke sebuah file csv kemudian membacanya lagi, tabel tidak dibaca sebagai MultiIndex lagi, namun hanya DataFrame biasa.
stock.to_csv('data_input/stock.csv')
stock_csv = pd.read_csv('data_input/stock.csv')
stock_csv.head()
Kita bisa saja menggunakan parameter index_col dan header agar stock_csv menjadi MultiIndex. Namun cara seperti ini kurang praktis apabila dibandingkan dengan menggunakan file pickle secara langsung.
stock_csv_multi = pd.read_csv('data_input/stock.csv', index_col=0, header=[0, 1])
stock_csv_multi.head()
File pickle hanya dapat dibuat dan dibaca oleh Python, sehingga tidak memungkinkan untuk transfer informasi lintas bahasa pemrograman ataupun aplikasi. Berikut adalah contoh file pickle apabila dibuka menggunakan text editor:

Pada bahasa pemrograman R, dikenal konsep pickling yang serupa yaitu dengan menggunakan file RDS.
.xs() dengan operator slicing [] digunakan untuk mengambil kolom, namun apa perbedaannya?¶Method .xs() atau cross-section digunakan untuk mengambil kolom tertentu yang letaknya tidak pada level terluar (pada MultiIndex DataFrame), sedangkan operator [] hanya dapat mengambil kolom pada level terluar.
stock = pd.read_pickle('data_input/stock')
stock.head()
Contoh: ingin mengambil kolom 'High' pada level 'Attributes' (terluar). Perhatikan bahwa code berikut ekuivalen:
high_slicing = stock['High']
high_xs = stock.xs(key='High', level='Attributes', axis=1)
high_slicing.equals(high_xs)
Contoh: ingin mengambil kolom AAPL pada level Symbols, maka kita tidak dapat menggunakan [], melainkan harus menggunakan .xs()
# stock['AAPL'] # KeyError: 'AAPL'
stock.xs(key='AAPL', level='Symbols', axis=1).head()
.reset_index()?¶Ketika method .reset_index() diaplikasikan ke sebuah DataFrame, maka index akan menjadi sebuah kolom baru. Maka method ini digunakan apabila kita diharuskan mengakses index sebagai sebuah nama kolom.
# stock['Date'] # KeyError: 'Date'
stock.reset_index()['Date']
Contohnya pada method .melt(), parameter id_vars dan value_vars mengharuskan kita untuk menspesifikan nama kolom yang dapat diakses.
# stock.melt(id_vars=['Date']) # KeyError: "The following 'id_vars' are not present in the DataFrame: ['Date']"
stock_melt = stock.reset_index().melt(id_vars=['Date'])
stock_melt
.melt() dapat mengubah DataFrame dari wide ke long, adakah operasi sebaliknya yaitu mengubah DataFrame dari long ke wide?¶Kebalikan dari method .melt() adalah .pivot(), yaitu mengubah bentuk DataFrame dari long ke wide. Sebagai contoh, mari gunakan objek stock_melt dari nomor sebelumnya:
stock_melt.pivot(index='Date',
columns=['Attributes', 'Symbols'],
values='value')
.pivot() dengan .pivot_table()?¶.pivot() digunakan untuk reshaping, dan mengekspektasi semua baris memiliki nilai yang unique. Dalam kasus ini Date, Attributes, dan Symbols pada stock_melt tidak ada yang duplicate..pivot_table() digunakan untuk aggregation, sehingga terdapat parameter aggfunc untuk menggabungkan nilai dari baris yang duplicate.# Cek apakah ada baris yang duplicated?
stock_melt[['Date', 'Attributes', 'Symbols']].duplicated().any()
Contoh kasus: kolom Nilai pada DataFrame nama_nilai akan kita gabung menjadi sebuah list berdasarkan masing-masing Nama.
nama_nilai = pd.DataFrame({'Nama': ['A', 'A', 'A', 'B', 'B', 'C', 'A'],
'Nilai': [1, 5, 3, 4, 2, 5, 2]})
nama_nilai
Untuk itu, bisa digunakan fungsi groupby() yang dilanjutkan dengan fungsi custom aggregate yaitu .agg():
nama_nilai.groupby('Nama').agg({
'Nilai': lambda x: list(sorted(x))
})
import matplotlib saat melakukan visualisasi melalui pandas?¶Dalam melakukan visualisasi data menggunakan method .plot(), library pandas menggunakan fungsi-fungsi yang terdapat pada matplotlib. Jadi meskipun kita tidak menggunakan matplotlib secara eksplisit, namun bergantung pada implementasi .plot(), kita tetap harus melakukan import matplotlib.pyplot as plt agar plot yang dibuat dapat tampil.
import matplotlib.pyplot as plt
Kita dapat sebut bahwa matplotlib adalah salah satu dependencies dari library pandas, artinya ketika kita menginstall pandas maka library matplotlib otomatis ter-install juga karena kebutuhan pandas dalam melakukan visualisasi. Kita dapat cek list dependencies dengan pd.show_versions():
#pd.show_versions()
matplotlib dari dasar, namun hanya menggunakan .plot()?¶Method .plot() sudah mempermudah kita dalam melakukan visualisasi langsung pada DataFrame, tanpa perlu mengerti cara penggunaan matplotlib. Hanya dengan 2 baris code di bawah ini, kita sudah dapat membuat sebuah visualisasi line plot:
stock['Volume'].plot()
plt.show()
Coba bandingkan ketika kita replikasi plot di atas menggunakan fungsi yang ada di base matplotlib, maka akan membutuhkan code yang lebih panjang seperti berikut:
data = stock['Volume']
for col in data.columns:
plt.plot(data[col], label=col) # secara iteratif plot 1 garis
plt.xticks(rotation=30, ha='right') # mengatur label ticks sumbu x
plt.xlabel(data.index.name) # mengubah label sumbu x
plt.legend(title=data.columns.names[0]) # menambahkan judul legenda
plt.show()
Namun, dengan menggunakan .plot() tidak banyak elemen yang dapat dikustomisasi. Biasanya kita mengombinasikannya juga dengan fungsi pada matplotlib juga agar semua elemen pada visualisasi dapat dikustomisasi.
Kunjungi: Matplotlib 3.2.2 Official Documentation
Jenis visualisasi dapat ditentukan berdasarkan tujuan visualisasi, yang secara umum dapat dibagi menjadi empat:

Selain itu, tipe visualisasi juga dapat ditentukan berdasarkan tipe data yang dimiliki. Silahkan kunjungi https://www.data-to-viz.com/ untuk panduan yang lebih lengkap, interaktif, dan disertai dengan contoh code.
Boxplot menggambarkan five number summary dari sebuah data:

Keterangan:
Catatan penting: Nilai "minimum" bukan nilai terkecil di data kita, begitupula nilai "maximum" bukan nilai terbesar di data kita.
Insight yang dapat diperoleh dari boxplot:
Misal kita akan mengekstrak nilai statistik dari boxplot stock['Volume'] berikut:
stock['Volume'].plot(kind='box', showmeans=True, vert=False)
plt.show()
Dengan menggunakan method boxplot_stats dari matplotlib.cbook, nilai statistik berikut dapat diperoleh:
mean: rata-rataiqr: interquartile range, selisih q3 dengan q1cilo: bawah bawah confidence interval dari mediancihi: bawah atas confidence interval dari medianwhishi: upper whisker atau pagar ataswhislo: lower whisker atau pagar bawahfliers: list berupa nilai outliersq1: kuartil 1med: kuartil 2 atau medianq3: kuartil 3Catatan: .values mengubah DataFrame menjadi sebuah numpy array.
from matplotlib.cbook import boxplot_stats
bp_stats = pd.DataFrame(boxplot_stats(stock['Volume'].values),
index=stock['Volume'].columns)
bp_stats
Nilai pada kolom fliers adalah sebuah list, kita juga dapat mengetahui ada berapa outlier pada masing-masing Symbols:
bp_stats['fliers'].apply(len)
matplotlib?¶Tentu saja, karena Python adalah bahasa pemrograman yang bersifat open source, tidak heran jika nantinya akan ada banyak sekali library visualisasi yang dapat digunakan. Namun yang perlu diperhatikan adalah kebutuhan atau tujuan kita dalam menampilkan visualisasi tersebut, apakah hanya bersifat statis untuk kebutuhan report yang dicetak di atas kertas atau grafik butuh ditampilkan secara interaktif untuk user. Sebagai saran tambahan, kita tidak perlu menguasai semua library yang ada, cukup disesuaikan dengan kebutuhan dan dalami satu atau dua library yang cocok.
Selanjutnya kita akan membahas beberapa library visualisasi yang umum digunakan pada Python selain matplotlib dan coba membuat replikasi dari plot sederhana berikut:
stock['Volume'].plot()
plt.show()
Sebelum kita memulai visualisasi, mayoritas function akan membutuhkan tipe DataFrame yang memanjang (long), sehingga kita lakukan reshaping dengan melt terhadap stock['Volume'] terlebih dahulu:
volume_melt = stock['Volume'].reset_index().melt(id_vars='Date', value_name='Volume')
volume_melt.head()
seaborn dibangun di atas matplotlib untuk membuat grafik yang indah dalam beberapa baris kode (tidak sebanyak matplotlib). Perbedaan utamanya adalah gaya default dan palet warna yang dirancang agar lebih estetis dan modern. Intinya seaborn membuat plot pada matplotlib yang terlihat tradisional menjadi lebih modern secara tampilan dan warna.
Kunjungi: Seaborn Official Documentation
import seaborn as sns
plt.style.use('seaborn')
sns.lineplot(data=volume_melt,
x='Date', y='Volume', hue='Symbols')
plt.show()
plotly adalah salah satu library yang memungkinkan kita membuat plot interaktif untuk user. Selain itu juga sangat kompatibel dengan Jupyter Notebook maupun web browser. plotly mendukung berbagai macam plot mulai dari tipe grafik dasar, plot seaborn (level advance), plot tiga dimensi, visualisasi berbasis peta, dan lain sebagainya.
Kunjungi: Plotly Official Documentation
import plotly.express as px
px.line(volume_melt,
x='Date', y='Volume', color='Symbols',
width=750, height=500)
bokeh adalah library yang dirancang untuk menghasilkan visualisasi interaktif yang ramah pada antarmuka web dan browser. Jika kita ingin menampilkan visualisasi ini di browser, ada fitur yang tersedia untuk mengekspornya dan dapat digunakan melalui JavaScript.
Kunjungi: Bokeh Official Documentation
from bokeh.plotting import figure, output_notebook, output_file, show
from bokeh.models import ColumnDataSource
from bokeh.palettes import Spectral4
output_notebook() # output tampil pada notebook
# output_file("stock_volume.html") # output berupa file html
# sumber data dari DataFrame
source = ColumnDataSource(stock['Volume'].reset_index())
# canvas
p = figure(x_axis_type="datetime", width=600, height=300)
# plot garis satu per satu
for sym, col in zip(stock['Volume'].columns, Spectral4):
p.line(x='Date', y=sym, legend_label=sym,
line_color=col, source=source,
muted_alpha=0.1, muted_color=col)
# fitur mute pada legend
p.legend.click_policy = 'mute'
# tampilkan plot
show(p)
altair adalah library visualisasi di Python yang bersifat deklaratif. Library ini dibangun di atas Vega dan Vega-Lite, yaitu visualization grammar yang digunakan untuk membuat, menyimpan, dan berbagi visualisasi yang interaktif. Dengan Vega, visualisasi dapat dideskripsikan menggunakan format JSON dan menghasilkan tampilan web-based menggunakan Canvas atau SVG.
Kunjungi: Altair Official Documentation
import altair as alt
alt.Chart(volume_melt).mark_line().encode(
x='Date',
y='Volume',
color='Symbols',
strokeDash='Symbols',
)
matplotlib¶Pada bagian ini, akan disajikan berbagai kustomisasi yang sering digunakan pada matplotlib dengan tujuan membuat visualisasi menjadi lebih apik dan indah.
Warna layout dapat diubah melalui method plt.style.use(). Berbagai macam style sheet sudah disediakan oleh matplotlib, daftarnya dapat dilihat pada plt.style.available.
Kunjungi: Matplotlib Style Sheets Reference
import matplotlib as mpl
import matplotlib.pyplot as plt
print(plt.style.available)
plt.style.use('bmh') # ubah style di sini
stock['Volume'].plot()
plt.show()
Secara default, matplotlib menggunakan theme 'default':
plt.style.use('default')
Pengaturan terhadap font dapat diubah melalui rcParams. Lebih detailnya disajikan pada link berikut.
plt.rcParams['font.family'] = "serif"
plt.rcParams['font.size'] = 12
stock['Volume'].plot()
plt.show()
Untuk reset kembali pengaturan font, dapat menggunakan .rcdefaults():
mpl.rcdefaults()
Tulisan pada judul (title) dan label axis (xlabel dan ylabel) dapat diatur agar plot lebih informatif.
stock['Volume'].plot()
plt.xlabel("DATE") # label sumbu x
plt.ylabel("VOLUME") # label sumbu y
plt.title("STOCK VOLUMES", fontweight='bold') # judul plot
plt.show()
Label pada ticks juga dapat diatur melalui axes, diakses melalui plt.gca()
import matplotlib.dates as mdates
import matplotlib.ticker as ticker
stock['Volume'].plot()
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b %Y')) # mengubah format tanggal
plt.gca().yaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}')) # comma separator untuk angka
plt.show()
Method plt.legend dapat digunakan untuk mengatur peletakan, label, orientasi, dan juga judul pada legenda.
stock['Volume'].plot()
plt.legend(
bbox_to_anchor=(1, 1), # bounding box: kanan, atas
loc='upper left', # lokasi tumpu dari kotak legenda
labels=['Apple', 'Facebook', 'Google'], # mengubah label pada legenda
title="Company") # judul legenda
plt.show()
stock['Volume'].plot()
plt.legend(
bbox_to_anchor=(0.5, -0.25), # bounding box: tengah, bawah
loc='upper center', # lokasi tumpu dari kotak legenda
labels=['Apple', 'Facebook', 'Google'], # mengubah label pada legenda
ncol=3) # orientasi legenda disusun menyamping
plt.show()